/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.io; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Random; import junit.framework.TestCase; import org.apache.commons.io.input.DemuxInputStream; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.io.output.DemuxOutputStream; /** * Basic unit tests for the multiplexing streams. * * @author <a href="mailto:peter@apache.org">Peter Donald</a> */ public class DemuxTestCase extends TestCase { private static final String T1 = "Thread1"; private static final String T2 = "Thread2"; private static final String T3 = "Thread3"; private static final String T4 = "Thread4"; private static final String DATA1 = "Data for thread1"; private static final String DATA2 = "Data for thread2"; private static final String DATA3 = "Data for thread3"; private static final String DATA4 = "Data for thread4"; private static Random c_random = new Random(); private HashMap m_outputMap = new HashMap(); private HashMap m_threadMap = new HashMap(); public DemuxTestCase( String name ) { super( name ); } private String getOutput( String threadName ) throws IOException { ByteArrayOutputStream output = (ByteArrayOutputStream)m_outputMap.get( threadName ); assertNotNull( "getOutput()", output ); return output.toString(); } private String getInput( String threadName ) throws IOException { ReaderThread thread = (ReaderThread)m_threadMap.get( threadName ); assertNotNull( "getInput()", thread ); return thread.getData(); } private void doStart() throws Exception { Iterator iterator = m_threadMap.keySet().iterator(); while( iterator.hasNext() ) { String name = (String)iterator.next(); Thread thread = (Thread)m_threadMap.get( name ); thread.start(); } } private void doJoin() throws Exception { Iterator iterator = m_threadMap.keySet().iterator(); while( iterator.hasNext() ) { String name = (String)iterator.next(); Thread thread = (Thread)m_threadMap.get( name ); thread.join(); } } private void startWriter( String name, String data, DemuxOutputStream demux ) throws Exception { ByteArrayOutputStream output = new ByteArrayOutputStream(); m_outputMap.put( name, output ); WriterThread thread = new WriterThread( name, data, output, demux ); m_threadMap.put( name, thread ); } private void startReader( String name, String data, DemuxInputStream demux ) throws Exception { ByteArrayInputStream input = new ByteArrayInputStream( data.getBytes() ); ReaderThread thread = new ReaderThread( name, input, demux ); m_threadMap.put( name, thread ); } public void testOutputStream() throws Exception { DemuxOutputStream output = new DemuxOutputStream(); startWriter( T1, DATA1, output ); startWriter( T2, DATA2, output ); startWriter( T3, DATA3, output ); startWriter( T4, DATA4, output ); doStart(); doJoin(); assertEquals( "Data1", DATA1, getOutput( T1 ) ); assertEquals( "Data2", DATA2, getOutput( T2 ) ); assertEquals( "Data3", DATA3, getOutput( T3 ) ); assertEquals( "Data4", DATA4, getOutput( T4 ) ); } public void testInputStream() throws Exception { DemuxInputStream input = new DemuxInputStream(); startReader( T1, DATA1, input ); startReader( T2, DATA2, input ); startReader( T3, DATA3, input ); startReader( T4, DATA4, input ); doStart(); doJoin(); assertEquals( "Data1", DATA1, getInput( T1 ) ); assertEquals( "Data2", DATA2, getInput( T2 ) ); assertEquals( "Data3", DATA3, getInput( T3 ) ); assertEquals( "Data4", DATA4, getInput( T4 ) ); } private static class ReaderThread extends Thread { private StringBuffer m_buffer = new StringBuffer(); private InputStream m_input; private DemuxInputStream m_demux; ReaderThread( String name, InputStream input, DemuxInputStream demux ) { super( name ); m_input = input; m_demux = demux; } public String getData() { return m_buffer.toString(); } public void run() { m_demux.bindStream( m_input ); try { int ch = m_demux.read(); while( -1 != ch ) { //System.out.println( "Reading: " + (char)ch ); m_buffer.append( (char)ch ); int sleepTime = Math.abs( c_random.nextInt() % 10 ); Thread.sleep( sleepTime ); ch = m_demux.read(); } } catch( Exception e ) { e.printStackTrace(); } } } private static class WriterThread extends Thread { private byte[] m_data; private OutputStream m_output; private DemuxOutputStream m_demux; WriterThread( String name, String data, OutputStream output, DemuxOutputStream demux ) { super( name ); m_output = output; m_demux = demux; m_data = data.getBytes(); } public void run() { m_demux.bindStream( m_output ); for( int i = 0; i < m_data.length; i++ ) { try { //System.out.println( "Writing: " + (char)m_data[ i ] ); m_demux.write( m_data[ i ] ); int sleepTime = Math.abs( c_random.nextInt() % 10 ); Thread.sleep( sleepTime ); } catch( Exception e ) { e.printStackTrace(); } } } } }